<?php

namespace app\common\exception;

use Exception;
use think\exception\Handle as ThinkHandle;
use think\exception\HttpResponseException;
use think\Log;

/**
 * 自定义异常处理器
 * 正确处理HttpResponseException，避免进入异常中止流程
 */
class Handle extends ThinkHandle
{
    /**
     * 不需要记录信息（日志）的异常类列表
     * @var array
     */
    protected $ignoreReport = [
        '\\think\\exception\\HttpException',
        '\\think\\exception\\HttpResponseException',
    ];

    /**
     * 异常处理
     * @param Exception $e
     * @return \think\Response
     */
    public function render(Exception $e)
    {
        // 如果是HttpResponseException，直接发送响应
        if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        }

        // 其他异常使用父类处理
        return parent::render($e);
    }

    /**
     * 记录异常信息（包括日志或者其它方式记录）
     * @param Exception $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        // HttpResponseException不需要记录日志
        if ($exception instanceof HttpResponseException) {
            return;
        }

        // 其他异常正常记录
        parent::report($exception);
    }
}
